Seminário LUA(11/0021401, 11/0067142, 11/0120660,13/0036285)
Lua é uma linguagem de extensão, criada nos laboratórios da PUC-RJ, com o objetivo de ser simples de ser embarcada. Isso é, ele é extremamente pequena, sucinta, de sintaxe simples, esta presente praticamente em qualquer sistema. É uma verdadeira “write once, run everywhere”(bem mais que java). O pacote de Lua, com documentação, código fonte e exemplos tem cerca de 800KBs, apenas o runtime compilado(no linux) tem 150KBs. São 1700 linhas de código C portável, o mesmo código compila em várias plataformas. Usuario Caracteristico e Dominio de aplicação A linguagem de programação Lua possui grande uso no domínio corporativo voltado para o mercado de jogos de computadores WoW e consoles de videogame Psychonauts. Além disso, é bastante empregada em aplicações Web e no desenvolvimento de ferramentas para auxiliar a pesquisa científica. Lua foi projetada para estender aplicações, sendo frequentemente utilizada como uma linguagem de propósito geral. Dessa forma, diversos casos de uso podem ter Lua como parte da implementação de uma solução, seja para o domínio empresarial, científico e industrial. A comunidade de desenvolvimento em linguagem Lua é de domínio geral. Assim, qualquer interessado pode ter acesso a documentação e o código fonte da implementação da linguagem, pois Lua é software livre de código aberto. Demais exemplos de uso da linguagem Lua de forma a descrever seus domínios de aplicação podem ser vistos da Internet, através do website oficial, nas referências finais deste trabalho. Evolução da Linguaguem* A versão mais recente acabou de ser lançada Lua 5.2.3 foi lançada em 07 de dezembro de 2013. Lua 5.0 foi lançado em 11 de abril de 2003. Seus principais novidades foram multithreading ''colaborativo via ''coroutines ''Lua '''Lua 4.0' foi lançado em 06 de novembro de 2000. Suas principais características novas eram múltiplos estados, uma nova API, para declarações e execução plena velocidade com informações de depuração completa. Lua 3.0 foi lançado em 01 julho de 1997. Sua principal novidade foi métodos tags como um poderoso substituto para fallbacks. Lua 2.1 foi lançado em 07 de fevereiro de 1995. Seus principais novidades foram semântica extensível através fallbacks ''e suporte para programação orientada a objetos. '''Lua 1.0' nunca foi lançado publicamente, mas foi instalado e funcionando em 28 de julho de 1993, e muito provavelmente alguns meses antes disso. '*' Não estão descritas todas as versões, foram suprimidas as versões intermediárias, afim de que o texto não ficasse muito extenso, as demais podem ser encontradas na página oficial de versões da linguagem . Lua orientada a objetos. *Os conceitos de Tabelas e Meta-Tabelas existentes em Lua permitem a utilização de um tipo específico de Programação Orientada a Objeto, chamado de "Prototype-Based". *Fica a cargo do programador criar convenções que simulem este paradigma. *Inexistência de polimorfismo paramétrico. local objs = { Text :new("O1", "Um texto curto "), Point : new ("O2" ,10 ,5) , Scalar :new("O3" ,20) } print ( Object . cliques ( objs )) Lua funcional. *Tratamento de funções como variáveis de primeira-ordem e a existência de Proper Tail Call. *Criação de alguns artifícios - como funções que manipulam tabelas para tratá-las como listas “imutáveis” através do uso de tabelas. local l = cons ( 1 , cons (2, cons (3 , Nil))) -- 1, 2 , 3 print (l) -- (1 2 3) print ( head (l)) -- 1 print ( tail (l)) -- (2 3) print (l) -- (1 2 3), l --e imutável Tipos de dados e variáveis. 'NIL' *Representa o valor indefinido ou inexistente. Exemplo: a = nil if (a) then … else … end -- entrará no else 'NUMBER' *Representa valores numéricos, sejam inteiros ou reais. *Internamente, são números de ponto flutuante com dupla precisão (double em C). 'STRING' *Representa uma cadeia de caracteres. *Delimitadores: **Aspas duplas: útil quanto se necessita de aspas simples na string. Exemplo: a = “Isto é um teste” **Aspas simples: útil quanto se necessita de aspas duplas na string. Exemplo: a = ‘Isto é uma “citação”.’ **Duplos colchetes: útil quando se necessita escrever a string em mais de uma linha. As quebras de linha farão parte da string. Exemplo: a = Esta é uma string em mais de uma linha **Caracter \ indica sequencias de escape, como em C Exemplo: \n \t \r \” \’ \\ 'FUNCTION' *Funções em Lua são do tipo de dados function. *É possível armazená-las em variáveis, em índices de tabelas, passá-las como parâmetros para outras funções ou retorná-las como resultados. *Funções em Lua podem retornar múltiplos valores e também fazer atribuições múltiplas Exemplo: function func1() … end (ou func1 = function() … end) 'USERDATA' *Armazena um ponteiro do tipo void* de C. *Útil para quem utiliza Lua dentro de um programa em C. 'TABLE' *Implementa vetores associativos – valores indexados por qualquer outro tipo (exceto nil). *Principal mecanismo de estrutura de dados de Lua. *Uma variável contém uma referência a uma tabela, e não a própria tabela. *Designação, passagem de parâmetros e retorno manipulam referências a tabelas, não implicando em cópia. *Tabelas devem ser criadas antes de serem utilizadas. Exemplo: a = {} a1 = “Teste” a“nome” = “João” --(equivale a a.nome = “João”) a.func1 = function() … end b = {1, “casa”; nome1 = “João”} 'UPVALUE' *Utiliza-se upvalues que são valores congelados quando a função dentro de onde eles aparecem é instanciada. Exemplos: function f() local a = 2 local g = function() local b = %a -- acessa valor congelado de 'a' no momento em que a função foi instanciada end end 'Declaração de variáveis'. *Variáveis não são fracamente tipadas em Lua, somente os valores armazenados nas mesmas o são a seguinte sequencia de instruções é válida: a = nil -- armazena em a um dado do tipo nil a = 1 -- passa a armazenar em a um dado do tipo number a = “Teste” -- passa a armazenar em a um dado do tipo string 'Variáveis globais.' *Não precisam ser declaradas, podem ser utilizadas diretamente. Exemplos: a = 2 -- a não foi declarada anteriormente. Recebe o valor 2 e é visível em todo o programa. b = (c nil) -- b e c não foram declaradas anteriormente. b recebe o valor 1 e é visível em todo o programa c continua indefinida (ou seja, nil). 'Variáveis locais.' *Podem ser declaradas em qualquer lugar dentro de um bloco de comandos. *Têm escopo somente dentro daquele bloco. *Quando declaradas com o mesmo nome que uma global, encobrem o acesso à global naquele bloco. Exemplos: local a -- 'a' é declarada e recebe nil. local a, b = 1, “x” -- declara 'a' e 'b', onde 'a' = 1 e 'b' = “x” a = 2 -- variável 'global' 'a' recebe 2 if (a > 0) then local b = a -- variável local b recebe valor da global a dentro do escopo do if a = a + 1 -- altera o valor da variável 'global' a. local a = b -- declara variável local a que recebe valor de b. print(a) -- imprime valor de variável local a que sobrepôs a 'global' a. end print (a) -- imprime o valor da variável global a. 'Atribuição e operadores.' 'Atribuição múltipla' a, b = “Teste”, 3 -- a recebe o valor “Teste” e b recebe 3. a, b = “Teste” -- a recebe o valor “Teste” e b recebe nil. a, b = “Teste”, 3, 5 -- a recebe o valor “Teste”, b recebe 3 e o valor 5 é desprezado. a, b = b, a -- Troca os valores de a e b entre si. 'Operadores relacionais' *São operadores relacionais de Lua: **Menor que (<) **Maior que (>) **Menor ou igual a (<=) **Maior ou igual a (>=) **Igual a ( ) **Diferente de (~=) *Operadores <, >, <=, >= são aplicáveis a number e string. *Operadores e ~= compara os tipos dos dados (retorna nil caso falso) e, em seguida, os valores. *Tabelas, funções e userdata são comparados por referência. *Retornam nil caso falso e 1 caso verdadeiro. Exemplos: a = 4 > 3 -- armazena 1 em a. b = (a 2) -- armazena nil em b. c = (b {1}) -- armazena nil em c. 'Operadores lógicos' *São operadores lógicos de Lua: **Conjunção (and). **Disjunção (or). **Negação (not). *Operadores and e or são avaliados da esquerda para a direita. *Avaliação do tipo curto-circuito (pára ao saber resultado). Exemplos: a = 10 b = 20 c = (a < 4) or (b < a) -- armazena nil em c avaliando toda a expressão. d = (a < 4) and (b < a) -- armazena nil em d sem precisar avaliar o (b < a). 'Operador de concatenação' *É representado por dois caracteres ponto (..). *Aplicável a tipo string, convertendo valores do tipo number quando concatenados a string. Exemplo: a = “Linguagem” b = “Lua” c = 3.2 c = a .. “ ” .. b .. c -- armazena “Linguagem Lua 3.2” em c. Estruturas de controle de fluxo 'Expressões' *Expressões podem retornar qualquer valor de qualquer tipo. *Sempre que retornar valores diferentes de nil, a expressão é considerada verdadeira. *Sempre que retornar o valor nil, a expressão é considerada falsa. 'Tomada de decisão'(if,else,elseif) if (not a) then print(“a igual a nil”) elseif (a 1) then print(“a = 1”) else print(“a é maior que 1”) end 'Laços Iterativos' while expr do bloco end i = 10 while (i >= 0) do i = i – 1 end repeat bloco until expr i = 10 repeat i = i – 1 until (i 0) Usando Lua Uma vez que o interpretador esteja instalado, é muito fácil usar Lua. Como não há o conceito de um programa principal, muito menos uma função main, qualquer comando passado para o interpretador é executado. Abaixo está um programa completo para imprimir "Olá mundo" na tela. print("Ola Mundo") Esse programa pode ser executado de várias formas. Direto pelo terminal usando o comando -e: $lua -e print("Ola Mundo") Com o modo interativo: $ lua > print("Ola Mundo") Escrevendo o programa em um arquivo e executando: $ lua nome-do-arquivo Ou chamando o arquivo através do modo interativo: $ lua > dofile("nome-do-arquivo") Comparando com outras linguagens Abaixo um gráfico de barras comparando o tempo de execução de um bubblesort com 1000 entradas aleatórias. O código foi executado em Lua, C ANSI puro e Perl. É possível perceber como Lua é mais rápida que a outra linguagem interpretada. Referencias USERS, L. Inheritance Tutorial. http://lua-users.org/wiki/InheritanceTutorial. IERUSALIMSCHY, R. Programming In Lua. Roberto Ierusalimschy, 2006. ISBN 8590379825. Disponíıvel em: http://www.lua.org/pil/index.html. IERUSALIMSCHY, R. Lua: manual. 03 2013. Disponível em: http://www.lua.org/manual/5.2/manual.html.